\documentclass{ctexart}
\usepackage{ctex}
\usepackage{hyperref}
\usepackage{indentfirst}
\usepackage{tikz}
\usepackage{tikz-uml}
% references formats
\usepackage[round]{natbib}
% Line & paragraph space
\usepackage{setspace}
\renewcommand{\baselinestretch}{1.5}
\setlength{\parskip}{0.8em}
% change style of section headings
\usepackage{sectsty}
\allsectionsfont{\sffamily}
% item list
\usepackage{enumitem}

\makeatletter \def\@maketitle{\null \begin{center} {\vskip 5em \Huge \@title} \vskip 30em {\LARGE \@author} \vskip 3em {\LARGE \@date} \end{center} \newpage} \makeatother
\renewcommand\contentsname{目录}

\title{TIKZ UML 示例}
\author{jouyouyun}
\date{2021-04-06}

\begin{document}

\maketitle
\tableofcontents
\newpage

\section{顺序图}
\subsection{对象类型}
顺序图绘制之前需要了解可用的对象类型，主要如下：
\begin{itemize}[leftmargin=4em]
\item umlactor -- 人员
\item umlentry -- 实体
\item umlboundary -- 边界
\item umlcontrol -- 控制
\item umldatabase -- 数据
\item umlmulti -- 多个对象
\end{itemize}

效果如下：
\begin{center}
  \begin{tikzpicture}
    \begin{umlseqdiag}
      \umlactor[class={Actor, Human}]{a}
      \umlentity[x=2, no ddots]{b}
      \umlboundary[x=4, class=C]{c}
      \umlcontrol[x=0, y=-2.5, class=D]{d}
      \umldatabase[x=2, y=-2.5, class=E]{e}
      \umlmulti[x=4, y=-2.5, class=F]{f}
    \end{umlseqdiag}
  \end{tikzpicture}

  图 1-1 对象类型
\end{center}

\subsection{示例图}
这里给出一个较全面的顺序图示例：
\begin{center}
  \begin{tikzpicture}
    \begin{umlseqdiag}
      \umlactor[no ddots]{a}
      \umldatabase[class=B, fill=blue!20]{b}
      \umlmulti[class=C]{c}
      \umlobject[class=D]{d}

      \begin{umlcall}[op={opa(k,v)},type=synchron, return=0]{a}{b}
        \begin{umlfragment}
          \begin{umlcall}[op=opb(), type=synchron, return=1]{b}{c}
            \begin{umlfragment}[type=alt,label=condition, inner xsep=8, fill=green!10]
              \begin{umlcall}[op=opc(), type=asynchron, fill=red!10]{c}{d}
              \end{umlcall}
              \begin{umlcall}[type=return]{c}{b}
              \end{umlcall}

              \umlfpart[condition2]
              \begin{umlcall}[op=opd(), type=synchron, return=3]{c}{d}
              \end{umlcall}

              \umlfpart[default]
              \begin{umlcall}[op=opdd(), type=synchron, return={id,name}]{c}{d}
              \end{umlcall}
            \end{umlfragment}
          \end{umlcall}
        \end{umlfragment}

        \begin{umlfragment}
          \begin{umlcallself}[op=ope(), type=synchron, return=4]{b}
            \begin{umlfragment}[type=assert]
              \begin{umlcall}[op=opf(), type=synchron, return=5]{b}{c}
              \end{umlcall}
            \end{umlfragment}
          \end{umlcallself}
        \end{umlfragment}
      \end{umlcall}

      \umlcreatecall[class=E, x=8]{a}{e}
      \begin{umlfragment}
        \begin{umlcall}[op=opg(), name=test, type=synchron, return=6, dt=7, fill=red!10]{a}{e}
          \umlcreatecall[class=F, stereo=boundary, x=12]{e}{f}
        \end{umlcall}
        \begin{umlcall}[op=oph(), type=synchron, return=7]{a}{e}
        \end{umlcall}
      \end{umlfragment}
    \end{umlseqdiag}
  \end{tikzpicture}
  图 1-2 示例
\end{center}

\subsection{高度}
对象声明的顺序决定了在顺序图里的位置，通过dt可设置调用的距离，可为负数。
\begin{center}
  \begin{tikzpicture}
    \begin{umlseqdiag}
      \umlobject[no ddots]{a}
      \umlobject[no ddots]{b}

      \begin{umlcallself}[op={生成证书对}, type=synchron]{a}
      \end{umlcallself}
      \begin{umlcall}[op={传递公钥，获取token}, type=synchron]{a}{b}
      \end{umlcall}
      \begin{umlcall}[op={公钥加密后的token}, type=return, dt=5]{b}{a}
      \end{umlcall}
    \end{umlseqdiag}
  \end{tikzpicture}

  图 1-2 高度
\end{center}

\end{document}
